From NYC Planning:

Geographic comparison

Load census data

ny_t_2020_filt <- ny_t_2020 %>%
  filter(AWATER < ALAND)

ny_t_2010_filt <- ny_t_2010 %>%
  filter(AWATER10 < ALAND10)

tract_intersection <- function(gdf1, gdf2, id) {
  gdf1 %>%
    filter(GEOID == id) %>%
    st_intersection(filter(gdf2, GEOID == id))
}

tract_difference <- function(gdf1, gdf2, id) {
  gdf1 %>%
    filter(GEOID == id) %>%
    st_difference(filter(gdf2, GEOID == id))
}

ny_t_int <- map_dfr(unique(ny_t_2020_filt$"GEOID"), ~tract_intersection(ny_t_2020_filt, ny_t_2010_filt, .))
ny_t_int
ny_t_diff_2020 <- map_dfr(unique(ny_t_2020_filt$"GEOID"), ~tract_difference(ny_t_2020_filt, ny_t_2010_filt, .))
ny_t_diff_2020
ny_t_diff_2010 <- map_dfr(unique(ny_t_2010_filt$"GEOID"), ~tract_difference(ny_t_2010_filt, ny_t_2020_filt, .))
ny_t_diff_2010
stopifnot(st_crs(ny_t_2020_filt) == st_crs(ny_t_2020_filt))

Intersection of census tracts between 2020 and 2010

Geographic difference in census tracts between 2020 and 2010

Scored difference

leaflet(data = ny_t_diff_comp) %>% 
  addProviderTiles(providers$CartoDB.Positron) %>% 
  addPolygons(data = ny_t_2010_filt,
              color = "black", stroke = T, weight = 0.2,
              fill = T, fillColor = "grey",
              group = "Census Tracts 2010") %>% 
  addPolygons(color = "gray", stroke = T,weight = 0.2,
              fill = T, fillColor = ~pal(area_ratio), fillOpacity = 1,
              group = "Census Tracts 2020") %>% 
  addLegend(position = "topright",
            pal = pal_rev,
            values = ~area_ratio,
            title = "Area ratio",
            labFormat = labelFormat(transform = function(area_ratio) 
              sort(area_ratio, decreasing = TRUE))) %>% 
  addLayersControl(overlayGroups = c("Census Tracts 2010", "Census Tracts 2020"))
## Warning: sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
## Need '+proj=longlat +datum=WGS84'

Population Comparison

racedata_sf %>%
  ggplot() +
  geom_sf(aes(fill = total20), color = NA) +
  theme_fc_map() +
  scale_fill_gradient(
    name = "Population in 2020",
    low = "#F4F4F4", high = "#40899A",
    # here we use guide_colourbar because it is still a continuous scale
    guide = guide_colorbar(
      direction = "horizontal",
      barheight = unit(2, units = "mm"),
      barwidth = unit(50, units = "mm"),
      draw.ulim = F,
      title.position = "top",
      # some shifting around
      title.hjust = 0.5,
      label.hjust = 0.5
    )
  ) +
  theme(legend.position = "bottom",
        text = element_text(color = "#22211d"))